#include "game.h"
#include <stdio.h>
#include <stdlib.h>
#include "new_window.h"

game::game()
{
}




// 处理up
void game::direction_up(void)
{
    //由于是向上处理，按列进行外层循环
    for(int y=0;y<4;y++)
    {
        //用来记录移动功能的代码执行次数
        int count_move = 0;
    move:
        //移动功能代码每执行一次，count_move自动加1
        count_move++;
        //从第一行开始把数据向0方向移动
        for(int x=1;x<4;x++)
        {
            //当数据为0时不需要移动
            if(0 == arr[x][y])continue;

            // 记录数据要移动到最终的位置
            int end_x = -1;
            // 在循环中寻找要移动到的位置
            for(int k=x-1;k>=0;k--)
            {
                //如果值为0，说明移动到此处，记录K的值
                if(0 == arr[k][y])
                {
                    end_x=k;
                }
                else// 一旦此数不为0则上面的数据都不为0
                {
                    break;
                }
            }
            // 如果end_x不等于-1说明找到了要移动到的位置
            if(-1 != end_x)
            {
                //把数据复制到目标位置
                arr[end_x][y] = arr[x][y];
                // 把原位置的数据清0
                arr[x][y] = 0;
                // 设置移动标志
                is_move_merge = true;
            }
        }
        // 如果移动功能代码已经执行两次，则进入下一列
        if(count_move>=2) continue;

        // 从第0行开始向寻找相同的数据进行合并
        for(int x=0;x<3;x++)
        {
            // 如果下一位置的数据与此相等且不等于0，则可以合并
            if(arr[x][y] && arr[x][y] == arr[x+1][y])
            {
                // 把此位置的数乘等于2
                arr[x+1][y] *=2;
                // 把合并过的数据清0
                arr[x][y] =0;
                // 设置合并标志
                is_move_merge = true;
            }
        }
        //当数据合并完成后，再次进行移动
        goto move;
    }
}

// 处理down
void game::direction_down(void)
{
    for(int y=0;y<4;y++)
    {
        int count_move = 0;
    move:
        count_move++;
        for(int x=2;x>=0;x--)
        {
            if(0 == arr[x][y]) continue;
            int end_x = -1;
            for(int k=x+1;k<4;k++)
            {
                if(0 == arr[k][y])
                {
                    end_x=k;
                }
                else
                {
                    break;
                }
            }
            if(-1 !=end_x)
            {
                arr[end_x][y] = arr[x][y];
                arr[x][y] = 0;
                is_move_merge = true;
            }
        }
        if(count_move>=2)continue;
        for(int x=3;x>0;x--)
        {
            if(arr[x][y] && arr[x][y] == arr[x-1][y])
            {
                arr[x-1][y] *=2;
                arr[x][y] = 0;
                is_move_merge = true;
            }
        }

        goto move;
    }
}

// 处理right
void game::direction_right(void)
{
    for(int x=0;x<4;x++)
    {
        int count_move = 0;
    move:
        count_move++;
        for(int y=2;y>=0;y--)
        {
            if(0 == arr[x][y])continue;
            int end_y = -1;
            for(int k=y+1;k<4;k++)
            {
                if(0 == arr[x][k])
                {
                    end_y=k;
                }
                else
                {
                    break;
                }
            }
            if(-1 != end_y)
            {
                arr[x][end_y] = arr[x][y];
                arr[x][y]=0;
                is_move_merge = true;
            }
        }
        if(count_move>=2)continue;
        for(int y=3;y>0;y--)
        {
            if(arr[x][y] && arr[x][y] == arr[x][y-1])
            {
                arr[x][y-1] *=2;
                arr[x][y] = 0;
                is_move_merge = true;
            }
        }
        goto move;
    }
}

// 处理left
void game::direction_left(void)
{
    for(int x=0;x<4;x++)
    {
        int count_move=0;
    move:
        count_move++;
        for(int y=1;y<4;y++)
        {
            if(0 == arr[x][y])continue;
            int end_y = -1;
            for(int k=y-1;k>=0;k--)
            {
                if(0 == arr[x][k])
                {
                    end_y=k;
                }
                else
                {
                    break;
                }
            }
            if(-1 != end_y)
            {
                arr[x][end_y] = arr[x][y];
                arr[x][y]=0;
                is_move_merge = true;
            }
        }
        if(count_move>=2)continue;
        for(int y=0;y<3;y++)
        {
            if(arr[x][y] && arr[x][y] == arr[x][y+1])
            {
                arr[x][y+1] *=2;
                arr[x][y]=0;
                is_move_merge=true;
            }
        }
        goto move;
    }
}
